package com.zwh.se.io;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Scanner;

/**
 * @author zwh
 * 估计一直以来都有人好奇往控制台输出信息的System.out.println()是怎么实现的,鉴于已经讲到了IO那就这个也说一下
 * System.in : "标准"输入流。-> 默认情况下，从键盘输入
 * System.out : "标准"输出流。 -> 默认情况下，输出到控制台。
 */
public class SystemIODemo {
    public static void main(String[] args) throws IOException {
        System.out.println("----------System.in -> 默认情况下,从键盘输入----------");
        //通过系统对象获取到标准输入流:也就是从键盘输入
        InputStream inputStream = System.in;
        //之前也有说read()方法在调用后会堵塞,只有在读取到有信息后才会继续往下执行。所以它是一个堵塞方法。
        int n = inputStream.read();
        System.out.println(n);
        //从上面的示例可以知道,实际上键盘录入就是System.in

        System.out.println("----------Scanner的本质----------");
        //然后联想一下使用Scanner的场景,是否是通过new Scanner(System.in)来使用的。
        //那么这个Scanner是啥?实际上它的作用是扫描器：而加入System.in参数代表其扫描的是键盘录入的数据
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        System.out.println(s);
        //既然它起到的是扫描作用,那么如果我不扫描键盘录入而想要扫描其他管的内容,是否可以?可以。
        sc = new Scanner(new FileInputStream("file/output.txt"));
        while (sc.hasNext()) {
            System.out.println(sc.next());
        }

        System.out.println("----------System.out -> 返回一个打印流----------");
        //将输出连接到控制台
        PrintStream printStream = System.out;
        //直接在控制台写出，但是不换行
        printStream.print("不换行");
        //直接在控制台写出，写完后换行
        printStream.println("换行");
        printStream.print("test");
    }
}
